package com.javasm.util;

import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.*;
@Component
@Slf4j
public class ExcelUtil { // excel工具类 （poi）

//    读取excel基本思路
//    1.获取工作簿  Workbook
//    2. 获取工作表 Sheet
//    3.获取每个sheet的总行数  rows
//    4.根据第一行获取总列数  cols
//    5.根据行数和列数，循环获取每一个单元格 Cell
//    6.判断单元格数据类型，输出数据

    public static void readExcel() throws Exception{
        try {
            List<Map<String,Object>> listMaps =new ArrayList();// excel读取数据结果封装到 list<map<String, object>>
           //读取文件地址
            String excelUrl = "D:\\dev\\ftmarket\\src\\main\\resources\\templates\\读取文件.xlsx";
            File xlsFile = new File(excelUrl);//创建file对象
            //获得工作簿 org.apache.poi.ss.usermodel.Workbook
            Workbook workbook = WorkbookFactory.create(xlsFile);
            // 获得工作表个数
            int sheetCount = workbook.getNumberOfSheets();
            // 遍历工作表
            for (int i = 0; i < sheetCount; i++) { // 遍历每一个工作表
                //获得工作表org.apache.poi.ss.usermodel.Sheet
                Sheet sheet = workbook.getSheetAt(i);
                System.out.println("当前sheet:"+sheet.getSheetName());
                // 获得行数
                int rows = sheet.getLastRowNum() + 1;
                if(rows <= 1){ continue; }
                // 获得列数，先获得一行，在得到该行列数
                Row tmp = sheet.getRow(0);
                if (tmp == null) { continue; }
                //第一行的列数 认为第一行的列数代表整个工作表的列数
                int cols = tmp.getPhysicalNumberOfCells();

                //读取表头  默认每一个sheet的第一行代表表头
                String[] header = new String[cols];
                for(int colNum=0;colNum<cols;colNum++){
                    Cell cell = tmp.getCell(colNum);
                    header[colNum]=cell.getStringCellValue();
                }
                // 读取数据, 从第二行开始读取数据
                for (int row = 1; row < rows; row++) {
                    Row r = sheet.getRow(row);//行
                    Map<String,Object> map = new HashMap<>();
                    for (int col = 0; col < cols; col++) {
                        Cell cell = r.getCell(col);//单元格
                        int type =   cell.getCellType();//单元格中的数据类型
                        String str = "";
                        String key = "";
                        switch (type){
                            case Cell.CELL_TYPE_STRING://字符串型 返回值String
                                str = cell.getStringCellValue();
                                 key  = header[col];
                                map.put(key,str);
                                break;
                            case Cell.CELL_TYPE_NUMERIC://数字型返回值 double
                                boolean isDate = DateUtil.isCellDateFormatted(cell);
                                if(isDate){
                                    Date date = cell.getDateCellValue();
                                    str = cn.hutool.core.date.DateUtil.format(date, "yyyy-MM-dd");
                                }else{
                                    str = String.valueOf(cell.getNumericCellValue());
                                }
                                 key  = header[col];
                                map.put(key,str);
                                break;
                        }
                    }
                    listMaps.add(map);
                }

                System.out.println(listMaps);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


//	   写Excel代码思路
//      1.创建输入文件对象FileOutputStream
//      2. 创建工作簿Workbook
//      3. 创建工作表Sheet
//      4. 创建行Row
//      5. 创建单元格Cell
//      6. 写入数据

    public static void writeExcel(List<Map<String,String>> listMap) throws Exception{
        try {
           // 获取需要写入sheet页的数据
            List<Map<String,String>> list  = new ArrayList<>();
            String[] headers = new String[]{"代理人Id","代理人名称","机构代码","机构名称","客户masterId","客户姓名","手机","创建时间"};
            Map<String,String> m = new HashMap<>();
            m.put("代理人Id","920053");
            m.put("代理人名称","ousd");
            m.put("机构代码","10010");
            m.put("机构名称","上海浦东新区");
            m.put("客户masterId","343832");
            m.put("客户姓名","李华");
            m.put("手机","1551231231");
            m.put("创建时间","2015-11-11");
            list.add(m);
            m = new HashMap<>();
            m.put("代理人Id","927383");
            m.put("代理人名称","zhengsh");
            m.put("机构代码","105");
            m.put("机构名称","天津");
            m.put("客户masterId","9447443");
            m.put("客户姓名","小刚");
            m.put("手机","109183423231");
            m.put("创建时间","2025-11-11");
            list.add(m);
            m = new HashMap<>();
            m.put("代理人Id","920681");
            m.put("代理人名称","jianfy");
            m.put("机构代码","101");
            m.put("机构名称","上海市");
            m.put("客户masterId","6474646");
            m.put("客户姓名","小花");
            m.put("手机","1738383737373");
            m.put("创建时间","2035-08-11");
            list.add(m);
            if(listMap == null){
                listMap=list;
            }
            log.info("查询返回的数据listMap:{}"+listMap);
            String excelUrl = "D:\\dev\\ftmarket\\src\\main\\resources\\templates\\upload\\生成文件（新）.xls";//导出地址
            File excelFile = new File(excelUrl);//创建File对象
            FileOutputStream xlsStream = new FileOutputStream(excelFile);
            // 创建工作薄  org.apache.poi.hssf.usermodel.HSSFWorkbook
            HSSFWorkbook workbook = new HSSFWorkbook();
            // 创建工作表 org.apache.poi.hssf.usermodel.HSSFSheet
            HSSFSheet sheet = workbook.createSheet("代理人信息表");//创建sheet页
            // 设置表头数据
            Row row0 = sheet.createRow(0);
            for (int i = 0; i < headers.length; i++) {
                Cell cell = row0.createCell(i);
                cell.setCellValue(headers[i]);
            }
            //
            int rowTotal = listMap.size();
            //将查询出来数据写入到工作表中
            for (int row = 0; row < rowTotal; row++) {
                Map<String, String> map = listMap.get(row);
                //创建一行 org.apache.poi.hssf.usermodel.HSSFRow
                HSSFRow rows = sheet.createRow(row+1);
                int cols = map.size();
                for (int col = 0; col < cols; col++) {  //循环向工作表(Sheet)中添加单元格(Cell)
                    //org.apache.poi.ss.usermodel.Cell
                    Cell cell = rows.createCell(col);//单元格
                    String value = map.get(headers[col]);
                    // 向工作表中添加数据
                    cell.setCellValue(value);
                }
            }
            workbook.write(xlsStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception {
        // 读取excel
        ExcelUtil.readExcel();
        // 写excel
        ExcelUtil.writeExcel(null);
    }
}
